#ifndef GULLENGINE_MATRIX4X3_H
#define GULLENGINE_MATRIX4X3_H

#include "Vector3D.h"



namespace gull {
    namespace core{
		
		class Matrix4x3;
        
		typedef Matrix4x3* Matrix4x3Ptr;
		
        class Matrix4x3
        {
        public:
            Matrix4x3();
            Matrix4x3(const Matrix4x3& m);
            Matrix4x3(const Vector3D& v1,const Vector3D& v2,const Vector3D& v3,const Vector3D& t);
            
            ~Matrix4x3();
            
            static void testClass();
            void identity();
            void transpose();
            Matrix4x3 inverse();
            double determinant();
			void rotateX(double degree);
			void rotateY(double degree);
			void rotateZ(double degree);
            
            Matrix4x3 operator-()const;
            Vector3D& operator[](unsigned int indice);
            const Vector3D& operator[](unsigned short indice) const;
            
            bool operator==(const Matrix4x3& m) const;
            bool operator!=(const Matrix4x3& m) const;
            
            Matrix4x3 operator*(const Matrix4x3& m) const;
            Matrix4x3& operator*=(const Matrix4x3& m);
            Matrix4x3 operator*(double a) const;
            Matrix4x3& operator*=(double a);
            Matrix4x3 operator/(double a) const;
            Matrix4x3& operator/=(double a);
            Matrix4x3& operator=(const Matrix4x3& m);
            
            
            
        protected:
            Vector3D m_v1;
            Vector3D m_v2;
            Vector3D m_v3;
            Vector3D m_t;
            
            
        private:
            
        };
                      
    }
}



extern std::ostream& operator<<(std::ostream& o,const gull::core::Matrix4x3& m);
extern gull::core::Vector3D operator*(const gull::core::Vector3D& v, const gull::core::Matrix4x3& m);
extern gull::core::Vector3D& operator*=(gull::core::Vector3D& v, const gull::core::Matrix4x3& m);
extern gull::core::Matrix4x3& transpose(gull::core::Matrix4x3& m);



#endif